﻿using System;
using System.Collections.Generic;

namespace VietNamKey
{
    public static class TypingMethods
	{
    	public static readonly ItemTypingMethod Telex = new ItemTypingMethod("Telex")	{ RemoveAccent = 'z', Acute = 's', Grave = 'f', Hook = 'r', Tilde = 'x', Heavy = 'j', AA = 'a', EE = 'e', OO = 'o', AW = 'w', OW = 'w', UW = 'w', DD = 'd', CAA = ' ', CEE = ' ', COO = ' ', CAW = ' ', COW = ' ', CUW = 'w', CDD = ' ', CD = ' ', _D = '1', _F = '2', _S = '3', _L = '4', _V = '5', _Z = '6', _J = '7', _W = '8', List = "zZsSfFrRxXjJaAeEoOwWdD1122334455667788"};
        public static readonly ItemTypingMethod TelexEx = new ItemTypingMethod("TelexEx"){RemoveAccent = 'z', Acute = 's', Grave = 'f', Hook = 'r', Tilde = 'x', Heavy = 'j', AA = 'a', EE = 'e', OO = 'o', AW = 'w', OW = 'w', UW = 'w', DD = 'd', CAA = ' ', CEE = ' ', COO = ' ', CAW = ' ', COW = ' ', CUW = ' ', CDD = ' ', CD = ' ', _D = '1', _F = '2', _S = '3', _L = '4', _V = '5', _Z = '6', _J = '7', _W = '8', List = "zZsSfFrRxXjJaAeEoOwWdD1122334455667788"};
        public static readonly ItemTypingMethod VIQR = new ItemTypingMethod("VIQR")		{ RemoveAccent = '0', Acute ='\'', Grave = '`', Hook = '?', Tilde = '~', Heavy = '.', AA = '^', EE = '^', OO = '^', AW = '(', OW = '+', UW = '+', DD = 'd', CAA = ' ', CEE = ' ', COO = ' ', CAW = ' ', COW = ' ', CUW = ' ', CDD = ' ', CD = ' ', _D = 'q', _F = 'f', _S = 's', _L = 'l', _V = 'v', _Z = 'z', _J = 'j', _W = 'w', List = "00\'\'``??~~..^^((++dDqQfFsSlLvVzZjJwW"};
        public static readonly ItemTypingMethod VNI = new ItemTypingMethod("VNI")		{ RemoveAccent = '0', Acute = '1', Grave = '2', Hook = '3', Tilde = '4', Heavy = '5', AA = '6', EE = '6', OO = '6', AW = '8', OW = '7', UW = '7', DD = '9', CAA = ' ', CEE = ' ', COO = ' ', CAW = ' ', COW = ' ', CUW = ' ', CDD = ' ', CD = ' ', _D = 'd', _F = 'f', _S = 's', _L = 'l', _V = 'v', _Z = 'z', _J = 'j', _W = 'w', List = "00112233445566778899dDfFsSlLvVzZjJwW"};
    	public static readonly ItemTypingMethod LHC = new ItemTypingMethod("LHC")		{ RemoveAccent = '0', Acute = '1', Grave = '2', Hook = '3', Tilde = '4', Heavy = '5', AA = ' ', EE = ' ', OO = ' ', AW = ' ', OW = ' ', UW = ' ', DD = ' ', CAA = '6', CEE = '7', COO = '8', CAW = '9', COW = ']', CUW = '[', CDD = 'z', CD = ' ', _D = 'd', _F = 'f', _S = 's', _L = 'l', _V = 'v', _Z = 'z', _J = 'j', _W = 'w', List = "0011223344556^7&8*9(]}[{zZdDfFsSlLvVzZjJwW"};
    	
        public static readonly ItemTypingMethod[] List = new[] {Telex, VNI, LHC, TelexEx, VIQR};
    }

    public class ItemTypingMethod
    {
        public ItemTypingMethod(string name) { Name = name; }
        public string Name { get; set; }
        public char RemoveAccent { get; set; } // Xoá dấu
        public char Acute { get; set; } // dấu sắc
        public char Grave { get; set; } // dấu huyền
        public char Hook { get; set; } // dấu hỏi
        public char Tilde { get; set; } // dấu ngã
        public char Heavy { get; set; } // dấu nặng
        
        public char AA { get; set; } // a/A -> â/Â
        public char EE { get; set; } // e/E -> ê/Ê
        public char OO { get; set; } // o/O -> ô/Ô
        public char AW { get; set; } // a/A -> ă/Ă
        public char OW { get; set; } // o/O -> ơ/Ơ 
        public char UW { get; set; } // u/U -> ư/Ư
        public char DD { get; set; } // d/D -> đ/Đ
        
        public char CAA { get; set; } // Chữ â/Â
        public char CEE { get; set; } // Chữ ê/Ê
        public char COO { get; set; } // Chữ ô/Ô
        public char CAW { get; set; } // Chữ ă/Ă
        public char COW { get; set; } // Chữ ơ/Ơ
        public char CUW { get; set; } // Chữ ư/Ư
        public char CDD { get; set; } // Chữ đ/Đ
        public char CD { get; set; } // Chữ d/D Định nghĩa lại chữ D bằng phím khác khi Đ dùng phím D
        // Phần này định nghĩa cho các phím gõ tắt cho nguyên âm ghép 
        //'d', 'f', 's', 'l', 'v', 'z', 'j', 'w'
        public char _D { get; set; }
        public char _F { get; set; }
        public char _S { get; set; }
        public char _L { get; set; }
        public char _V { get; set; }
        public char _Z { get; set; }
        public char _J { get; set; }
        public char _W { get; set; }
        
        public string List { get; set; } // Xác định các ký tự thuộc bộ gõ này
        public char Get(char Value)
        { // Lấy ký tự được khai báo trong bộ gõ, các ký tự gốc nằm ở vị trí chẵn
        	int Index = List.IndexOf(Value);// Thuộc tính List được gán giá trị là một chuỗi các ký
        	if(Index < 0) return '\b';		// tự bỏ dấu có thể được gõ  
        	if(Index % 2 == 0) return Value;// vd 2@ thì 2 là ký tự được gõ lúc bình thường, @ là ký tự
        	else return List[Index - 1];	// được gõ lúc nhấn SHIFT
        }
        public char ValueOf(int Index)
        {
        	if(Index == 1) return Acute;
        	if(Index == 2) return Grave;
        	if(Index == 4) return Hook;
        	if(Index == 3) return Tilde;
        	if(Index == 5) return Heavy;
        	return '\b';
        }
        public bool Contains(char Value)
        {
        	return char.ToLower(Value) == 'o' || List.IndexOf(Value) > -1;
        }  
        public int IndexOf(char Value)
        { // Dùng để xác định index của dấu nhằm tìm ra ký tự UNICODE phù hợp
        	if(Value == Acute) return 1;
        	if(Value == Grave) return 2;
        	if(Value == Hook) return 4;
        	if(Value == Tilde) return 3;
        	if(Value == Heavy) return 5;
        	return 0;
        }
        public override string ToString()
        {
            return Name;
        }
    }
}